﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.Remoting.Messaging;

namespace celinda.Formulaire
{
    public partial class Connexion : ComponentFactory.Krypton.Toolkit.KryptonForm
    {
        private int NbTentative = 0;
        public Boolean cont = false;

        public Connexion()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Vérifie que toutes les conditions du formulaire sont remplis pour le soumettre
        /// </summary>
        /// <returns>Si tout est OK true, false sinon</returns>
        private bool ValideForm()
        {
            // Champ Login de renseigné ?
            if (this.kTxtLogin.Text.Trim() == string.Empty)
            {
                Class.Outils.Alerte("Ce champ est obligatoire.", false);
                this.kTxtLogin.Focus();
                return false;
            }
            // Champ Password de renseigné ?
            if (this.kTxtMotDePasse.Text.Trim() == string.Empty)
            {
                Class.Outils.Alerte("Ce champ est obligatoire.", false);
                this.kTxtMotDePasse.Focus();
                return false;
            }
            return true;
        }

        /// <summary>
        /// Lance le processus de connexion
        /// </summary>
        private void LanceConnexion()
        {
            Repository.UtilisateurRepositoryNH dao = new Repository.UtilisateurRepositoryNH();
            // Si le formulaire est correctement rempli
            if (this.ValideForm())
            {
                // Nous incrémentons le nombre de tentative de connexion
                this.NbTentative++;
                try
                {
                    // Nous chargeons l'utilisateur avec le Login
                    Class.Utilisateur ou = dao.GetByPropertyName("Login",kTxtLogin.Text.Trim()).Count() > 0 ? dao.GetByPropertyName("Login",kTxtLogin.Text.Trim())[0] : null;
                    IList<Class.Utilisateur> lou = dao.GetByPropertyName("Login", kTxtLogin.Text.Trim());
                    // Si le mot de passe est identique à celui en base
                    if (ou != null)
                    {
                        if (ou.MotDePasse == this.kTxtMotDePasse.Text)
                        {
                            // Si l'utilisateur est actif
                            if (ou.Etat == Class.Const.EtatActif)
                            {
                                // Nous sauvegardons l'utilisateur en mémoire pour améliorer les temps de réponses
                                CallContext.SetData(Class.Const.UserConnected, ou);
                                // Nous indiquons au programme que la connexion est OK
                                this.cont = true;
                                // Nous fermons le fenêtre connexion
                                this.Close();
                            }
                            // L'utilisateur est inactif
                            else
                            {
                                // Nous l'indiquons à l'écran
                                Class.Outils.Alerte("Utilisateur Inactif.", false);
                            }
                        }
                        // Le mot de passe ne correspond pas à celui enregistré en base
                        else
                        {
                            // Nous vidons le champ Password
                            this.kTxtMotDePasse.Text = string.Empty;
                            this.TextExtra = "Tentative " + this.NbTentative;
                            // Nous indiquons l'erreur à l'écran
                            Class.Outils.Alerte("Utilisateur et/ou Mot de passe invalide.", false);
                            // Nous indiquons au programme que la connexion est KO
                            this.cont = false;
                            // Si le nombre de tentative de connexion est trop élevé
                            if (this.NbTentative.Equals(3))
                            {
                                // Nous fermons la fenêtre
                                this.Close();
                            }
                        }
                    }
                    // Le mot de passe ne correspond pas à celui enregistré en base
                    else
                    {
                        // Nous vidons le champ Password
                        this.kTxtMotDePasse.Text = string.Empty;
                        this.TextExtra = "Tentative " + this.NbTentative;
                        // Nous indiquons l'erreur à l'écran
                        Class.Outils.Alerte("Utilisateur et/ou Mot de passe invalide.", false);
                        // Nous indiquons au programme que la connexion est KO
                        this.cont = false;
                        // Si le nombre de tentative de connexion est trop élevé
                        if (this.NbTentative.Equals(3))
                        {
                            // Nous fermons la fenêtre
                            this.Close();
                        }
                    }
                }
                catch (Exception ex)
                {
                    // En cas d'erreur non gérée, nous l'affichons
                    Class.Outils.Erreur("Erreur Critique", ex.Message, false);
                }
            }
        }

        private void kBtnValid_Click(object sender, EventArgs e)
        {
            LanceConnexion();
        }

        private void kBtnFerme_Click(object sender, EventArgs e)
        {
            // Nous indiquons au programme que la connexion est KO
            this.cont = false;
            // Nous fermons la fenêtre de connexion
            this.Close();
        }

        private void Connexion_Activated(object sender, EventArgs e)
        {
            this.ActiveControl = this.kTxtLogin;
        }
    }
}
